let arr1 = [1, 2, 3, 4, 5, 1, 2, 3];

let arr2 = ['it666', 'it666', 'itzb'];

let arr3 = [true, true, false, false];

/**
 * 数组去重1 不能去重{}
 * @param {Array} arr 
 */
function unique(arr) {

    return Array.form(new Set(arr));

}
/**
 * 数组去重2 不能去重{}
 * @param {Array} arr 
 */
function unique2(arr) {
    let res = arr.filter((item, index, arr) => {
        //当前元素:在原始数组中的第一个索引==当前索引值,否则返回当前元素
        console.log(arr.indexOf(item, 0), "item", item);
        return arr.indexOf(item, 0) === index;
    });
    return res;
}

/**
 * 数组去重
 * @param {Array} arr 
 */
function unique3(arr) {
    var obj = {};
    return arr.filter(function(item, index, arr) {
        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
    })
}

function unique4(arr) {
    const  newArr  =  arr1.reduce((acc,  value)  =>  {        
        console.log(value);            
        const  tempArr  =  acc.map(item  =>  JSON.stringify(item));             // console.log(tempArr);
        return  tempArr.includes(JSON.stringify(value))  ?  acc  :  [...acc,  value]        
    },   []);
}
var arr4 = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', {}, {}];

console.log(unique2(arr4));
console.log(unique3(arr4));

// console.log(unique2(arr2));
// console.log(unique2(arr3));